<?php
/**
 * Arquivo de definição do ambiente onde o programa deverá rodar
 * @package config
 * @author Jose Berardo
 * @author Túlio Carvalho
 * @version 2.0
 */
// -------------------------------------------------------------

/**
 * Ambiente
 */
define('AMBIENTE', 'configuracao');
/**
 * Caminho do arquivo que define as regras de navegação
 */

// -------------------------------------------------------------
// Registrando o ambiente a ser utilizado

// Se alguma URL for informada
function configurar_ambiente() {				
	if (isset($_GET['url'])) {			  
	  if(substr($_GET['url'], strlen($_GET['url'])-1)=="/")
	  	$_GET['url'] = substr($_GET['url'], 0,strlen($_GET['url'])-1);
	  	
	  $dados = explode("/", $_GET['url']);	
	}

	Controlador::getInstancia()->set('ambiente', AMBIENTE);
	
	// Registrando o array de dados colhido do ambiente
	$dados_ambiente = array();
	$dados_ambiente = parse_ini_file(CONFIG . DS . Controlador::getInstancia()->get('ambiente') . '.ini', true);
	Controlador::getInstancia()->set('dados_ambiente', 
	                                 $dados_ambiente);
	
	// Definição da regionalização
	setlocale(LC_ALL, "pt_BR", "ptb");
	date_default_timezone_set('Brazil/East');

	if (isset($dados)) return $dados;
}
/**
 * Função para registrar as demais informações colhidas da URL 
 * @param array $dados
 */
function registrar_url($dados) {
	
	// Recuperando os dados do ambiente 
	$dados_ambiente = Controlador::getInstancia()->get('dados_ambiente');
	if($dados_ambiente["roteamento"]["ativo"])
		verificaRota($dados);		
	if(!Controlador::getInstancia()->existe("modulo")){			
		// Se ainda houver registros na URL - retirar módulo
	if (count ( $dados ) > 0) {
		// Retirar a informação do módulo
		//Controlador::getInstancia()->set('modulo', $modulo);	
		$modulo = array_shift ( $dados );				
		if (!pesquisarNoDiretorio ( CONTROLADOR, $modulo )) {								
			Controlador::getInstancia ()->set ( 'modulo', $dados_ambiente ['controlador'] ['modulo_default'] );
			Controlador::getInstancia ()->set ( 'acao', $modulo );		 
		}	 				
		// Se ainda houver registros na URL - retirar ação
		if (count ( $dados ) > 0) {			
			if(!Controlador::getInstancia()->existe("acao")){
				$acao = array_shift ( $dados );
				if ($acao != "") {
					Controlador::getInstancia ()->set ( 'acao', $acao );
				} else {
					Controlador::getInstancia ()->set ( 'acao', $dados_ambiente ['controlador'] ['acao_default'] );
				}
			}
			// Se ainda houver registros na URL - parâmetros
			// E não ser uma simples string vazia
			if (count ( $dados ) > 0 && $dados [0] != "") {
				Controlador::getInstancia ()->set ( 'parametros', $dados );
			}
		
		// Se não houver mais
		} else {
			// Apenas ação determinada a partir
			// do padrão para aquele ambiente			
			if(!Controlador::getInstancia()->existe("acao")){				
				Controlador::getInstancia ()->set ( 'acao', $dados_ambiente ['controlador'] ['acao_default'] );
			}
		}
	
		// Se não houver mais
	} else {
		// Módulo e ação determinados a partir
		// do padrão para aquele ambiente
		Controlador::getInstancia ()->set ( 'modulo', $dados_ambiente ['controlador'] ['modulo_default'] );
		Controlador::getInstancia ()->set ( 'acao', $dados_ambiente ['controlador'] ['acao_default'] );
	}
		
	
	
	
	}

}

function configurar_sessao() {
	$dados_ambiente = Controlador::getInstancia()->get('dados_ambiente');
	if ($dados_ambiente['sessao']['auto_start']) {
		session_start();
	}
}

function verificaRota($dados){		
	$dados_ambiente = Controlador::getInstancia()->get('dados_ambiente');
	$rotas = Roteamento::getRotas();
	$paran = array();		
	if(!empty($rotas) && !empty($dados)){		
		$url = implode("/",$dados);		
		foreach($rotas as $rota){
			$rotaEditada = str_replace(array("'?'*","'?'"), ".*", $rota["rota"]);															
			if(preg_match($rotaEditada,$url )){									
				if(!Controlador::getInstancia()->existe("modulo")){
					$caminho = explode("/",$rota["rota"]);						
					foreach($caminho as $key=>$path){
						if($path=="'?'"){							
							$paran[] = $dados[$key];
						}else if($path == "'?'*"){								
							for($i=$key;$i<cont($dados);$i++)
								$paran[] = $dados[i];
						}
					}																	
					if(pesquisarNoDiretorio(CONTROLADOR, $rota["controlador"])==0)
						return 0;												
					Controlador::getInstancia()->set('acao',trim($rota["acao"]));
					if(!empty($paran)){						
						Controlador::getInstancia ()->set ( 'parametros', $paran );
					}
					return 1;
				}
			}									
		}
  	} 	  	
  	return 0;      
    	
}

function pesquisarNoDiretorio($dir,$modulo){		
	foreach (new DirectoryIterator($dir) as $arquivo) {		  			  		
		if ($arquivo->isFile() && $arquivo != "Controlador.php" && $arquivo != "Modulo.php" && $arquivo != "ControleException.php") {
  			$controlador = strtolower(str_replace(".php","",$arquivo));	  		  			  			
  			if($modulo == $controlador){  	  						  			
	  			if(!Controlador::getInstancia()->existe('modulo')){
	  				Controlador::getInstancia()->set('modulo', trim($controlador));	  				
	  			}
	  				
	  			return 1;
	  		}
  		}elseif(!$arquivo->isDot() && $arquivo->isDir()){  			
  			if(pesquisarNoDiretorio($arquivo->getPathname(),$modulo))
  			  	return 1;		
  		}
  	}
  	return 0;
}

// Executando a configuração do ambiente
$dados = configurar_ambiente();
registrar_url($dados);
configurar_sessao();
?>